package com.qf.test01.utils;

import com.qf.test01.service.UserService;
import com.qf.test01.service.impl.UserServiceImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理工具类
 */
public class MyProxyFactory {
    /**
     * @param target 原始对象
     * @return 动态代理对象
     */
    public static Object getProxy(Object target) {
        InvocationHandler invocationHandler = new InvocationHandler() {
            //动态生成的对象中，方法是invoke

            /**
             *
             * @param proxy 动态对象本身
             * @param method 在动态代理对象上调用了哪个方法
             * @param args 在动态代理对象上调用方法时，所传递的参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //判断method是不是属于Object类型，如果是，则不做时间统计
                if (method.getDeclaringClass().equals(Object.class)) {
                    return method.invoke(target, args);
                }
                //添加辅助功能
                long start = System.currentTimeMillis();
                Object result = method.invoke(target, args);
                Thread.sleep(100);
                long end = System.currentTimeMillis();
                System.out.println("时间：" + (end - start));
                return result;
            }
        };
        //JDK提供的创建动态代理对象的方法
        /**
         * 参数1：ClassLoader用于加载动态生成的class文件
         * 参数2：规定了动态生成的对象的类型，即该对象实现了哪些接口
         * 参数3：添加的辅助功能写在该对象中
         */

        return Proxy.newProxyInstance(
                MyProxyFactory.class.getClassLoader(),
                target.getClass().getInterfaces(),
                invocationHandler
        );
    }

    public static void main(String[] args) {
        UserService userServiceProxy =(UserService) MyProxyFactory.getProxy(new UserServiceImpl());
        userServiceProxy.helloUser();
        userServiceProxy.getUserByName("张三");
    }
}
